WebGLã¬ã€ãã¬ãŒã·ã³ã°æ¡åŒµæ©èœã®ãšããµã€ãã£ã³ã°ãªäžçãæ¢æ±ãããŠã§ããã©ãŠã¶ã«ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã«ããã¬ã€ãã¬ãŒã·ã³ã°ãããããããªã¢ã«ã¿ã€ã ã¬ã³ããªã³ã°ã«é©åœãèµ·ãããŸãã
WebGLã¬ã€ãã¬ãŒã·ã³ã°æ¡åŒµæ©èœïŒãŠã§ãäžã§ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã«ããã¬ã€ãã¬ãŒã·ã³ã°ãè§£æŸãã
é·å¹Žã«ããããã¬ã€ãã¬ãŒã·ã³ã°ã¯ã³ã³ãã¥ãŒã¿ã°ã©ãã£ãã¯ã¹ã®èæ¯ãšãããæ£ç¢ºãªã©ã€ãã£ã³ã°ãåå°ã圱ãåãããã©ããªã¢ãªã¹ãã£ãã¯ãªç»åãçŽæããŠããŸãããåŸæ¥ããã®èšç®éã®å€ããããªãã©ã€ã³ã¬ã³ããªã³ã°ã«éå®ãããŠããŸããããè¿å¹Žã®ããŒããŠã§ã¢ã®é²æ©ã«ããããªã¢ã«ã¿ã€ã ã¬ã€ãã¬ãŒã·ã³ã°ãçŸå®ã®ãã®ãšãªããŸããããããŠä»ãWebGLã¬ã€ãã¬ãŒã·ã³ã°æ¡åŒµæ©èœã®ç»å Žã«ããããã®åŒ·åãªæè¡ããŠã§ãããŒã¹ã®ã°ã©ãã£ãã¯ã¹ã«é©åœãããããããšããŠããŸãã
ã¬ã€ãã¬ãŒã·ã³ã°ãšã¯ïŒ
ã¬ã€ãã¬ãŒã·ã³ã°ã¯ãã·ãŒã³å ã®ãªããžã§ã¯ããšå ãçžäºäœçšããæ¹æ³ãã·ãã¥ã¬ãŒãããã¬ã³ããªã³ã°æè¡ã§ããããªãŽã³ãã©ã¹ã¿ã©ã€ãºãã代ããã«ãã¬ã€ãã¬ãŒã·ã³ã°ã¯ã«ã¡ã©ããã®å ç·ã®çµè·¯ããã©ããã·ãŒã³å ã®ãªããžã§ã¯ããšäº€å·®ãããŸã§è¿œè·¡ããŸããåå ç·ã®è²ãšåŒ·åºŠãèšç®ããããšã§ãã¬ã€ãã¬ãŒã·ã³ã°ã¯ãªã¢ã«ãªã©ã€ãã£ã³ã°ãåå°ã圱ãæã€ç»åãçæããŸãã
ãããã®å¹æãè¿äŒŒããã©ã¹ã¿ã©ã€ãºãšã¯ç°ãªããã¬ã€ãã¬ãŒã·ã³ã°ã¯å ã®èŒžéãããç©ççã«æ£ç¢ºã«è¡šçŸããèŠäºãªããžã¥ã¢ã«ããããããŸãããããããã®æ£ç¢ºãã«ã¯å€§ããªèšç®ã³ã¹ãã䌎ãããªã¢ã«ã¿ã€ã ã¬ã€ãã¬ãŒã·ã³ã°ã¯å°é£ãªåæ¥ãšãªã£ãŠããŸãã
ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã«ããã¬ã€ãã¬ãŒã·ã³ã°ã®å°é
åŸæ¥ã®ã¬ã€ãã¬ãŒã·ã³ã°ã®èšç®äžã®éçãå æãããããã°ã©ãã£ãã¯ã¹ã«ãŒãã¡ãŒã«ãŒã¯ã¬ã€ãã¬ãŒã·ã³ã°èšç®ãé«éåããããã®å°çšããŒããŠã§ã¢ãéçºããŸãããNVIDIAã®RTXãAMDã®Radeon RXã·ãªãŒãºãªã©ã®æè¡ã¯ãããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããç¹æ®ãªã¬ã€ãã¬ãŒã·ã³ã°ã³ã¢ãçµã¿èŸŒãã§ããããªã¢ã«ã¿ã€ã ã¬ã€ãã¬ãŒã·ã³ã°ãå¯èœã«ããŠããŸãã
ãããã®ããŒããŠã§ã¢ã®é²æ©ã¯ãã¬ã€ãã¬ãŒã·ã³ã°ã掻çšããŠåäŸã®ãªãã¬ãã«ã®ãªã¢ãªãºã ãéæããæ°ããã¬ã³ããªã³ã°æè¡ãžã®éãéããŸãããã²ãŒã ãã·ãã¥ã¬ãŒã·ã§ã³ããã®ä»ã®ã¢ããªã±ãŒã·ã§ã³ã¯çŸåšãã¬ã€ãã¬ãŒã·ã³ã°ã«ããåå°ã圱ãã°ããŒãã«ã€ã«ãããŒã·ã§ã³ãªã©ãåãå ¥ããæ²¡å ¥æã®ããèŠèŠçã«èŠäºãªäœéšãçã¿åºããŠããŸãã
WebGLã¬ã€ãã¬ãŒã·ã³ã°æ¡åŒµæ©èœïŒã¬ã€ãã¬ãŒã·ã³ã°ããŠã§ãã«ãããã
ãŠã§ããã©ãŠã¶å ã§ã€ã³ã¿ã©ã¯ãã£ããª2Dããã³3Dã°ã©ãã£ãã¯ã¹ãã¬ã³ããªã³ã°ããããã®æšæºAPIã§ããWebGLã¯ãåŸæ¥ã©ã¹ã¿ã©ã€ãºã«äŸåããŠããŸãããããããã¬ã€ãã¬ãŒã·ã³ã°æ¡åŒµæ©èœã®å°å ¥ã«ãããWebGLã¯ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã«ããã¬ã€ãã¬ãŒã·ã³ã°ã®åãæŽ»çšã§ããããã«ãªããŸãããããã«ããããŠã§ãããŒã¹ã®ã°ã©ãã£ãã¯ã¹ã«ç¡éã®å¯èœæ§ãåºãããéçºè ã¯ãã©ãŠã¶ã§çŽæ¥ããããªã¢ã«ã§é åçãªäœéšãäœæã§ããããã«ãªããŸãã
ãããã®æ¡åŒµæ©èœã¯ãJavaScriptãšWebGLã§äœ¿çšãããã·ã§ãŒãã£ã³ã°èšèªã§ããGLSLïŒOpenGL Shading LanguageïŒãéããŠãåºç€ãšãªãã¬ã€ãã¬ãŒã·ã³ã°ããŒããŠã§ã¢ã«ã¢ã¯ã»ã¹ããã¡ã«ããºã ãæäŸããŸãããããã®æ¡åŒµæ©èœã掻çšããããšã§ãéçºè ã¯ãŠã§ãã¢ããªã±ãŒã·ã§ã³ã«ã¬ã€ãã¬ãŒã·ã³ã°ãçµ±åããå°çšã®ã¬ã€ãã¬ãŒã·ã³ã°ããŒããŠã§ã¢ã®ããã©ãŒãã³ã¹äžã®å©ç¹ã掻çšã§ããŸãã
äž»èŠãªWebGLã¬ã€ãã¬ãŒã·ã³ã°æ¡åŒµæ©èœïŒ
GL_EXT_ray_tracing: ããã¯WebGLã«ãããã¬ã€ãã¬ãŒã·ã³ã°ã®åºç€ãæäŸããã³ã¢æ¡åŒµæ©èœã§ãåºæ¬çãªã¬ã€ãã¬ãŒã·ã³ã°é¢æ°ãšããŒã¿æ§é ãå®çŸ©ããŸããããã«ãããéçºè ã¯ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã¹ãã©ã¯ãã£ãäœæããã¬ã€ãçºå°ããã¬ã€ãã¬ãŒã·ã³ã°ã®çµæã«ã¢ã¯ã»ã¹ã§ããŸããGL_EXT_acceleration_structure: ãã®æ¡åŒµæ©èœã¯ãã·ãŒã³ãžãªã¡ããªãšã¬ã€ãå¹ççã«äº€å·®ãããããã«äœ¿çšãããéå±€çãªããŒã¿æ§é ã§ããã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã¹ãã©ã¯ãã£ãå®çŸ©ããŸããã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã¹ãã©ã¯ãã£ã®æ§ç¯ãšç®¡çã¯ãããã©ãŒãã³ã¹ã«å€§ããªåœ±é¿ãäžãããããã¬ã€ãã¬ãŒã·ã³ã°ã«ãããéèŠãªã¹ãããã§ããGL_EXT_ray_query: ãã®æ¡åŒµæ©èœã¯ããããè·é¢ãããããããžãªã¡ããªã亀差ç¹ã§ã®ãµãŒãã§ã¹æ³ç·ãªã©ãã¬ã€ãã¬ãŒã·ã³ã°ã®çµæãã¯ãšãªããã¡ã«ããºã ãæäŸããŸãããã®æ å ±ã¯ãã·ã§ãŒãã£ã³ã°ãšã©ã€ãã£ã³ã°ã®èšç®ã«äžå¯æ¬ ã§ãã
WebGLã¬ã€ãã¬ãŒã·ã³ã°ã®å©ç¹
WebGLãžã®ã¬ã€ãã¬ãŒã·ã³ã°æ¡åŒµæ©èœã®å°å ¥ã¯ãããã€ãã®éèŠãªå©ç¹ããããããŸãïŒ
- ããžã¥ã¢ã«å質ã®åäžïŒ ã¬ã€ãã¬ãŒã·ã³ã°ã¯ãåå°ã圱ãã°ããŒãã«ã€ã«ãããŒã·ã§ã³ã®ãããªã¢ã«ãªã¬ã³ããªã³ã°ãå¯èœã«ããèŠèŠçã«èŠäºã§æ²¡å ¥æã®ãããŠã§ãäœéšã«ã€ãªãããŸãã
- ããã©ãŒãã³ã¹ã®åäžïŒ ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã«ããã¬ã€ãã¬ãŒã·ã³ã°ã¯ãåŸæ¥ã®ã©ã¹ã¿ã©ã€ãºããŒã¹ã®æè¡ãšæ¯èŒããŠå€§å¹ ãªããã©ãŒãã³ã¹åäžããããããããè€éã§è©³çްãªã·ãŒã³ãå¯èœã«ããŸãã
- æ°ããåµé çå¯èœæ§ïŒ ã¬ã€ãã¬ãŒã·ã³ã°ã¯ããŠã§ãéçºè ã«æ°ããåµé çå¯èœæ§ãéãã以åã¯äžå¯èœã ã£ã驿°çã§èŠèŠçã«é åçãªã¢ããªã±ãŒã·ã§ã³ã®äœæãå¯èœã«ããŸãã
- ã¯ãã¹ãã©ãããã©ãŒã äºææ§ïŒ WebGLã¯ã¯ãã¹ãã©ãããã©ãŒã APIã§ãããWebGLã䜿çšããŠéçºãããã¬ã€ãã¬ãŒã·ã³ã°ã¢ããªã±ãŒã·ã§ã³ã¯ãäºææ§ã®ãããã©ãŠã¶ãšããŒããŠã§ã¢ãåããã©ã®ããã€ã¹ã§ãå®è¡ãããŸãã
- ã¢ã¯ã»ã·ããªãã£ïŒ WebGLã¯ããŠãŒã¶ãŒã远å ã®ãœãããŠã§ã¢ãã€ã³ã¹ããŒã«ããå¿ èŠãªãããŠã§ããã©ãŠã¶ãä»ããŠç°¡åã«ã¢ã¯ã»ã¹ã§ãããããã¬ã€ãã¬ãŒã·ã³ã°ã¢ããªã±ãŒã·ã§ã³ãå±éããããã®äŸ¿å©ã§ã¢ã¯ã»ã¹ãããããã©ãããã©ãŒã ãæäŸããŸãã
WebGLã¬ã€ãã¬ãŒã·ã³ã°ã®ãŠãŒã¹ã±ãŒã¹
WebGLã¬ã€ãã¬ãŒã·ã³ã°ã¯ãããŸããŸãªæ¥çã§å¹ åºãæœåšçãªçšéããããŸãïŒ
- ã²ãŒã ïŒ ã¬ã€ãã¬ãŒã·ã³ã°ã¯ããŠã§ãããŒã¹ã®ã²ãŒã ã®ããžã¥ã¢ã«å¿ å®åºŠãé«ããããæ²¡å ¥æã®ãããªã¢ã«ãªã²ãŒã äœéšãçã¿åºããŸããã¬ã€ãã¬ãŒã¹ãããåå°ã圱ã®ãããã¡ãŒã¹ãããŒãœã³ã·ã¥ãŒã¿ãŒããã¬ã€ãããããªã¢ã«ãªã°ããŒãã«ã€ã«ãããŒã·ã§ã³ã®ããä»®æ³äžçãæ¢çŽ¢ãããããããšãæ³åããŠã¿ãŠãã ããã
- 補åã®èŠèŠåïŒ ã¬ã€ãã¬ãŒã·ã³ã°ã䜿çšããŠè£œåã®ãªã¢ã«ãªã¬ã³ããªã³ã°ãäœæãã顧客ãè³Œå ¥åã«è©³çްã«èŠèŠåã§ããããã«ããŸããããšãã°ãå®¶å ·è²©å£²åºã¯ã¬ã€ãã¬ãŒã·ã³ã°ã䜿çšããŠãä»®æ³ã·ã§ãŒã«ãŒã ã§è£œåã®è³ªæãç §æãæ«é²ããããšãã§ããŸãã
- 建ç¯ã®èŠèŠåïŒ å»ºç¯å®¶ã¯ã¬ã€ãã¬ãŒã·ã³ã°ã䜿çšããŠå»ºç©ãã€ã³ããªã¢ã®ãªã¢ã«ãªèŠèŠåãäœæããã¯ã©ã€ã¢ã³ãããã¶ã€ã³ãè©³çŽ°ã«æ¢çŽ¢ã§ããããã«ããŸããããã«ãããã¯ã©ã€ã¢ã³ãã¯ãã¶ã€ã³ãããããçè§£ããæ å ±ã«åºã¥ããæ±ºå®ãäžãããšãã§ããŸãã建ç©ã建èšãããåã«ããªã¢ã«ãªç §æãšåå°ã®ãã建ç©ã®ä»®æ³ã¢ãã«ãæ¢çŽ¢ãããã®ç©ºéãäœéšããããšãæ³åããŠã¿ãŠãã ããã
- ä»®æ³çŸå®ïŒVRïŒãšæ¡åŒµçŸå®ïŒARïŒïŒ ã¬ã€ãã¬ãŒã·ã³ã°ã¯ãVRããã³ARäœéšã®ãªã¢ãªãºã ãé«ããããæ²¡å ¥æã®ããé åçãªç°å¢ãäœãåºããŸããããšãã°ãã¬ã€ãã¬ãŒã·ã³ã°ã䜿çšããŠVRã²ãŒã ã§ãªã¢ã«ãªåœ±ãåå°ãäœæããããARã¢ããªã±ãŒã·ã§ã³ã§ä»®æ³ãªããžã§ã¯ããçŸå®äžçã«æ£ç¢ºã«éãåããããããããšãã§ããŸãã
- ç§åŠçèŠèŠåïŒ ã¬ã€ãã¬ãŒã·ã³ã°ã¯ãæµäœååŠã®ã·ãã¥ã¬ãŒã·ã§ã³ãååæ§é ãªã©ãè€éãªç§åŠããŒã¿ãèŠèŠåããããã«äœ¿çšã§ããŸããããã«ãããç§åŠè ã¯ããŒã¿ãããããçè§£ããæ°ããªçºèŠãããããšãã§ããŸãã
- æè²ïŒ ã¬ã€ãã¬ãŒã·ã³ã°ã䜿çšããŠã€ã³ã¿ã©ã¯ãã£ããªæè²ã·ãã¥ã¬ãŒã·ã§ã³ãäœæããåŠçãè€éãªæŠå¿µãèŠèŠçã«é åçãªæ¹æ³ã§æ¢çŽ¢ã§ããããã«ããŸããããšãã°ãç©çã·ãã¥ã¬ãŒã·ã§ã³ã§ã¯ã¬ã€ãã¬ãŒã·ã³ã°ã䜿çšããŠå ã®æ¯ãèããæ£ç¢ºã«ã·ãã¥ã¬ãŒãããåŠçãå åŠã®åçãèŠèŠåã§ããããã«ããŸãã
æè¡çãªèæ ®äºé
WebGLã¬ã€ãã¬ãŒã·ã³ã°ã¯å€ãã®å©ç¹ãæäŸããŸãããçæãã¹ãããã€ãã®æè¡çãªèæ ®äºé ããããŸãïŒ
- ããŒããŠã§ã¢èŠä»¶ïŒ ã¬ã€ãã¬ãŒã·ã³ã°ã«ã¯ãNVIDIA RTXãAMD Radeon RXã·ãªãŒãºã®GPUãªã©ã®å°çšããŒããŠã§ã¢ãå¿ èŠã§ããã¬ã€ãã¬ãŒã·ã³ã°ã䜿çšããã¢ããªã±ãŒã·ã§ã³ã¯ããã®ããŒããŠã§ã¢ããªãã·ã¹ãã ã§ã¯å®è¡ãããªãããããã©ãŒãã³ã¹ãäœäžããŸãã
- ããã©ãŒãã³ã¹ã®æé©åïŒ ã¬ã€ãã¬ãŒã·ã³ã°ã¯èšç®éãå€ããªãå¯èœæ§ããããããè¯å¥œãªããã©ãŒãã³ã¹ãéæããã«ã¯ãã·ãŒã³ãšã¬ã€ãã¬ãŒã·ã³ã°ã³ãŒããæé©åããããšãéèŠã§ããããã«ã¯ã詳现ã¬ãã«ïŒLODïŒãé©å¿ãµã³ããªã³ã°ãªã©ã®æè¡ã䜿çšããããšãå«ãŸããå ŽåããããŸãã
- ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã¹ãã©ã¯ãã£ã®ç®¡çïŒ ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã¹ãã©ã¯ãã£ã®æ§ç¯ãšç®¡çã¯ãã¬ã€ãã¬ãŒã·ã³ã°ã®ããã©ãŒãã³ã¹ã«ãšã£ãŠéèŠã§ããéçºè ã¯ãã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã¹ãã©ã¯ãã£ã®éžæãšãã·ãŒã³ãå€åããã«ã€ããŠãããæŽæ°ããæŠç¥ãæ éã«æ€èšããå¿ èŠããããŸãã
- ã·ã§ãŒããŒã®è€éãïŒ ã¬ã€ãã¬ãŒã·ã³ã°ã·ã§ãŒããŒã¯è€éã«ãªãå¯èœæ§ããããGLSLãšã¬ã€ãã¬ãŒã·ã³ã°ã¢ã«ãŽãªãºã ã®ååãªçè§£ãå¿ èŠã§ããéçºè ã¯ãå¹ççã§å¹æçãªã¬ã€ãã¬ãŒã·ã³ã°ã·ã§ãŒããŒãäœæããããã®æ°ããæè¡ãåŠã¶å¿ èŠããããããããŸããã
- ãããã°ïŒ ã¬ã€ãã¬ãŒã·ã³ã°ã³ãŒãã®ãããã°ã¯ãåã ã®ã¬ã€ã®çµè·¯ã远跡ããå¿ èŠããããããå°é£ãªå ŽåããããŸããéçºè ã¯ããšã©ãŒãç¹å®ããŠä¿®æ£ããããã«ãç¹æ®ãªãããã°ããŒã«ã䜿çšããå¿ èŠããããããããŸããã
äŸïŒWebGLã§ã®ã¬ã€ãã¬ãŒã¹åå°ã®å®è£
ã¬ã€ãã¬ãŒã·ã³ã°æ¡åŒµæ©èœã䜿çšããŠWebGLã§ã¬ã€ãã¬ãŒã¹åå°ãå®è£ ããæ¹æ³ã®ç°¡åãªäŸãèããŠã¿ãŸãããããã®äŸã§ã¯ãã«ã¡ã©ãã·ãŒã³ã°ã©ãããããªã¢ã«ã·ã¹ãã ãåããåºæ¬çãªWebGLã·ãŒã³ãã»ããã¢ãããããŠããããšãåæãšããŠããŸãã
- ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã¹ãã©ã¯ãã£ã®äœæïŒ
ãŸããã·ãŒã³ãžãªã¡ããªã衚ãã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã¹ãã©ã¯ãã£ãäœæããå¿ èŠããããŸããããã¯
GL_EXT_acceleration_structureæ¡åŒµæ©èœã䜿çšããŠè¡ãããšãã§ããŸããã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã¹ãã©ã¯ãã£ã¯ãã¬ã€ãšã·ãŒã³ãå¹ççã«äº€å·®ãããããã«äœ¿çšãããŸãã - ã¬ã€çæã·ã§ãŒããŒã®äœæïŒ
次ã«ãã«ã¡ã©ããã¬ã€ãçºå°ããã¬ã€çæã·ã§ãŒããŒãäœæããå¿ èŠããããŸãããã®ã·ã§ãŒããŒã¯ãç»é¢äžã®ãã¯ã»ã«ãå埩åŠçããåãã¯ã»ã«ã«å¯ŸããŠã¬ã€ãçæããŸãã
以äžã¯ãã¬ã€çæã·ã§ãŒããŒã®ç°¡åãªäŸã§ãïŒ
#version 460 core #extension GL_EXT_ray_tracing : require layout(location = 0) rayPayloadInEXT vec3 hitValue; layout(binding = 0, set = 0) uniform accelerationStructureEXT topLevelAS; layout(binding = 1, set = 0) uniform CameraData { mat4 viewInverse; mat4 projectionInverse; } camera; layout(location = 0) out vec4 outColor; void main() { vec2 uv = vec2(gl_LaunchIDEXT.x, gl_LaunchIDEXT.y) / vec2(gl_LaunchSizeEXT.x, gl_LaunchSizeEXT.y); vec4 ndc = vec4(uv * 2.0 - 1.0, 0.0, 1.0); vec4 viewSpace = camera.projectionInverse * ndc; vec4 worldSpace = camera.viewInverse * vec4(viewSpace.xyz, 0.0); vec3 rayOrigin = vec3(camera.viewInverse[3]); vec3 rayDirection = normalize(worldSpace.xyz - rayOrigin); RayDescEXT rayDesc; rayDesc.origin = rayOrigin; rayDesc.direction = rayDirection; rayDesc.tMin = 0.001; rayDesc.tMax = 1000.0; traceRayEXT(topLevelAS, gl_RayFlagsOpaqueEXT, 0xFF, 0, 0, 0, rayDesc, hitValue); outColor = vec4(hitValue, 1.0); } - æè¿æ¥ãããã·ã§ãŒããŒã®äœæïŒ
ãŸããã¬ã€ããªããžã§ã¯ããšäº€å·®ãããšãã«å®è¡ãããæè¿æ¥ãããã·ã§ãŒããŒãäœæããå¿ èŠããããŸãããã®ã·ã§ãŒããŒã¯ã亀差ç¹ã§ã®ãªããžã§ã¯ãã®è²ãèšç®ããããããããå€ãšããŠè¿ããŸãã
以äžã¯ãæè¿æ¥ãããã·ã§ãŒããŒã®ç°¡åãªäŸã§ãïŒ
#version 460 core #extension GL_EXT_ray_tracing : require layout(location = 0) rayPayloadInEXT vec3 hitValue; hitAttributeEXT vec3 attribs; layout(location = 0) attributeEXT vec3 normal; void main() { vec3 n = normalize(normal); hitValue = vec3(0.5) + 0.5 * n; } - ã¬ã€ãã¬ãŒã·ã³ã°ãã€ãã©ã€ã³ã®èµ·åïŒ
æåŸã«ãã¬ã€ãã¬ãŒã·ã³ã°ãã€ãã©ã€ã³ãèµ·åããå¿ èŠããããŸããããã«ã¯ãã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã¹ãã©ã¯ãã£ãã¬ã€çæã·ã§ãŒããŒãæè¿æ¥ãããã·ã§ãŒããŒããã€ã³ãããã¬ã€ãã¬ãŒã·ã³ã°èšç®ããã£ã¹ãããããããšãå«ãŸããŸãã
- åå°ã®å®è£
ïŒ
æè¿æ¥ãããã·ã§ãŒããŒã§ã¯ãåã«ãµãŒãã§ã¹ã®è²ãè¿ãã®ã§ã¯ãªããåå°ãã¯ãã«ãèšç®ããŸããæ¬¡ã«ãåå°æ¹åã«æ°ããã¬ã€ãçºå°ããŠãåå°ããããªããžã§ã¯ãã®è²ã決å®ããŸããããã«ã¯ãã¬ã€ãã¬ãŒã·ã³ã°ãã€ãã©ã€ã³ãååž°çã«åŒã³åºãïŒç¡éã«ãŒããé¿ããããã®å¶éå ã§ïŒããåå°çšã«å¥ã®ãã¹ã䜿çšããå¿ èŠããããŸããæçµçãªè²ã¯ããµãŒãã§ã¹ã®è²ãšåå°ãããè²ã®çµã¿åããã«ãªããŸãã
ããã¯ç°¡ç¥åãããäŸã§ãããå®éã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãè€æ°ã®ããŠã³ã¹ã®åŠçãããŸããŸãªå æºã®ãµã³ããªã³ã°ãã¢ã³ããšã€ãªã¢ã·ã³ã°ã®é©çšãªã©ãããè€éãªèšç®ãå¿ èŠã«ãªããŸããã¬ã€ãã¬ãŒã·ã³ã°ã¯èšç®ã³ã¹ããé«ããªãå¯èœæ§ããããããããã©ãŒãã³ã¹ã念é ã«çœ®ããŠããããšãå¿ããªãã§ãã ããã
WebGLã¬ã€ãã¬ãŒã·ã³ã°ã®æªæ¥
WebGLã¬ã€ãã¬ãŒã·ã³ã°ã¯ãŸã åææ®µéã«ãããŸããããŠã§ãããŒã¹ã®ã°ã©ãã£ãã¯ã¹ãå€é©ããå¯èœæ§ãç§ããŠããŸããããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã«ããã¬ã€ãã¬ãŒã·ã³ã°ãããåºãå©çšå¯èœã«ãªãã«ã€ããŠããã®æè¡ãåãå ¥ãããŠã§ãã¢ããªã±ãŒã·ã§ã³ããŸããŸãå¢ããŠããããšãäºæ³ãããŸããããã«ãããããŸããŸãªæ¥çã§ãããªã¢ã«ã§é åçãªãŠã§ãäœéšãçãŸããã§ãããã
ããã«ãWebGLãæ åœããçµç¹ã§ããKhronos Groupå ã§ã®ç¶ç¶çãªéçºãšæšæºåã®åãçµã¿ã¯ãAPIã®ãããªãæ¹åãšãã©ãŠã¶ãã³ããŒã«ããæ¡çšã®å¢å ã«ã€ãªããã§ããããããã«ãããã¬ã€ãã¬ãŒã·ã³ã°ããŠã§ãéçºè ã«ãšã£ãŠããã¢ã¯ã»ã¹ãããããªããWebGLã¬ã€ãã¬ãŒã·ã³ã°ãšã³ã·ã¹ãã ã®æé·ãå éããŸãã
WebGLã¬ã€ãã¬ãŒã·ã³ã°ã®æªæ¥ã¯æãããä»åŸæ°å¹Žéã§ããã«ãšããµã€ãã£ã³ã°ãªçºå±ãèŠãããããšãæåŸ ãããŸããæè¡ãæçããã«ã€ããŠããŠã§ãããŒã¹ã®ã°ã©ãã£ãã¯ã¹ã«æ°ããªå¯èœæ§ãè§£ãæŸãããæ°äžä»£ã®æ²¡å ¥åã§èŠèŠçã«èŠäºãªäœéšãçãŸããã§ãããã
ã°ããŒãã«ãªåœ±é¿ãšã¢ã¯ã»ã·ããªãã£
WebGLã¬ã€ãã¬ãŒã·ã³ã°ã®ç»å Žã¯ãé«å質ãªã°ã©ãã£ãã¯ã¹ãžã®ã°ããŒãã«ãªã¢ã¯ã»ã·ããªãã£ã«å€§ããªåœ±é¿ãäžããå¯èœæ§ããããŸããåŸæ¥ã®ãã€ãšã³ãã°ã©ãã£ãã¯ã¹ã¢ããªã±ãŒã·ã§ã³ã¯ãå°éã®ããŒããŠã§ã¢ãšãœãããŠã§ã¢ãå¿ èŠãšããããšãå€ããååãªãªãœãŒã¹ãæã€å人ãçµç¹ã«ããå©çšã§ããŸããã§ããã
ãŠã§ãããŒã¹ã®æè¡ã§ããWebGLã¯ãããæ°äž»åãããã¢ãããŒããæäŸããŸãããŠãŒã¶ãŒãäºææ§ã®ãããã©ãŠã¶ãšããŒããŠã§ã¢ïŒã¬ã€ãã¬ãŒã·ã³ã°å¯Ÿå¿ã®çµ±åã°ã©ãã£ãã¯ã¹ã®æ¡çšã«ããããŸããŸãäžè¬çã«ãªã£ãŠããŸãïŒã«ã¢ã¯ã»ã¹ã§ããéãããããã®é«åºŠãªã°ã©ãã£ãã¯ã¹æ©èœãäœéšã§ããŸããããã¯ããã€ãšã³ãããŒããŠã§ã¢ãžã®ã¢ã¯ã»ã¹ãéãããŠããå°åããå°éãœãããŠã§ã¢ã®ã©ã€ã»ã³ã¹ãé«äŸ¡ãªå°åã§ç¹ã«æçã§ãã
ããã«ãWebGLã®ã¯ãã¹ãã©ãããã©ãŒã æ§ã«ãããã¢ããªã±ãŒã·ã§ã³ã¯ãã¹ã¯ããããã©ãããããããæºåž¯é»è©±ãã¿ãã¬ãããŸã§ãå¹ åºãããã€ã¹ã§å®è¡ã§ããŸããããã«ãããã¬ã€ãã¬ãŒã·ã³ã°æè¡ã®ãªãŒããããã«åºãããããåºãäžçäžã®èŠèŽè ãå©çšã§ããããã«ãªããŸãã
ãã ããããŒããŠã§ã¢èœåã«åºã¥ãããžã¿ã«ããã€ãã®å¯èœæ§ãèªèããããšãéèŠã§ããã¬ã€ãã¬ãŒã·ã³ã°å¯Ÿå¿ã®ããŒããŠã§ã¢ã¯æ®åãã€ã€ãããŸããããŸã æ®éçã«å©çšã§ããããã§ã¯ãããŸãããéçºè ã¯ãã¹ã±ãŒã©ãã«ã§ããŸããŸãªããŒããŠã§ã¢æ§æã«é©å¿ã§ããã¢ããªã±ãŒã·ã§ã³ãäœæããããåªããã¹ãã§ãããããã«ãããæ§èœã®äœãããã€ã¹ã䜿çšãããŠãŒã¶ãŒãè¯å®çãªäœéšãåŸãããããã«ããå¿ èŠããããŸãã
çµè«
WebGLã¬ã€ãã¬ãŒã·ã³ã°æ¡åŒµæ©èœã¯ããŠã§ãããŒã¹ã®ã°ã©ãã£ãã¯ã¹ã®é²åã«ãããéèŠãªäžæ©ã衚ããŠããŸããããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã«ããã¬ã€ãã¬ãŒã·ã³ã°ããŠã§ããã©ãŠã¶ã«ããããããšã§ããããã®æ¡åŒµæ©èœã¯ããããªã¢ã«ã§ãé åçã§ãæ²¡å ¥æã®ããäœéšãåµé ããããã®ç¡éã®å¯èœæ§ãéããŸããæè¡çãªèæ ®äºé ã¯ãããŸãããWebGLã¬ã€ãã¬ãŒã·ã³ã°ã®å©ç¹ã¯åŠå®ã§ããããŠã§ãã®æªæ¥ã«ãããŠãŸããŸãéèŠãªåœ¹å²ãæããããšãæåŸ ãããŸãã
æè¡ãæçããããåºãæ¡çšãããã«ã€ããŠããŠã§ãéçºè ã¯ãããŸã§æ³åãã§ããªãã£ããããªé©æ°çã§èŠèŠçã«èŠäºãªã¢ããªã±ãŒã·ã§ã³ãäœæã§ããããã«ãªãã§ãããããŠã§ãã°ã©ãã£ãã¯ã¹ã®æªæ¥ã¯æãããWebGLã¬ã€ãã¬ãŒã·ã³ã°ã¯ãã®é²åã®äž»èŠãªæšé²åãšãªãã§ãããã